package studentUeb;

import studentUeb.*;
import htw.student.*;
import htw.list.*;
import htw.queue.*;
import htw.exceptions.*;
import studentUeb.exceptions.*;

/**
 * Beschreiben Sie hier die Klasse StudentQueue.
 * 
 * @author Andreas Dier, Steffen Schuhmann 
 * @version 1.5
 */
public class StudentQueue extends Queue
{
    private StudentList liste;

    /** 
     * Liste erzeugen 
     */
    public StudentQueue() {
        liste = new StudentList();        
    }

    /** 
     * Element am Ende der Liste anhaengen   
     *
     * @param o einzufuegendes Element
     * @exception NoListException falls liste null ist
     * @exception StudentAlreadyInListException falls es den Studenten schon gibt bzw. einen mit der gleichen MatrNr
     */
    public void add(Student o) throws htw.exceptions.NoListException, StudentAlreadyInListException {
        if( liste == null )
            throw new htw.exceptions.NoListException("Liste wurde noch nicht angelegt");
        
        int position;
        
        position = liste.indexOf(o);
        
        if( position == -1)
        {
           if( ((Student) liste.get(position)).getMatrikelNr() == o.getMatrikelNr() )
           {
               throw new StudentAlreadyInListException("Student mit der MatrNr schon vorhanden in der Liste");
           } 
           else
           {
               liste.addLast(o);
           }
        }
        else
        {
            throw new StudentAlreadyInListException("Student mit der MatrNr schon vorhanden in der Liste");
        }
    }

    /** 
     * Komplette Liste loeschen        
     */
    public void clear() {
        liste = null;
    }

    /** 
     * Enthaelt die Liste den Studenten
     *
     * @param o einzufuegendes Element
     * @return true, falls der Student in der Liste vorkommt, false sonst
     * @exception NoListException falls liste null ist
     */
    public boolean contains(Student o) throws htw.exceptions.NoListException {
        if( liste == null )
            throw new htw.exceptions.NoListException("Liste wurde noch nicht angelegt");
        return liste.contains(o);
    }


    /** 
     * Student an der Stelle index zurueckgeben 
     * 
     * @param index Der Index dessen zugehoeriges Objekt zurueckzugeben ist (0 <= index < size)
     * @return der gefundene Student
     * @exception NoListException falls liste null ist
     */
    public Student get(int index) throws htw.exceptions.NoListException {
        if( liste == null )
            throw new htw.exceptions.NoListException("Liste wurde noch nicht angelegt");
            
        return (Student) liste.get( index);
    }

    /** 
     * Das erste Element zurueckgeben 
     * 
     * @return der erste Student
     */
    public Student getFirst() {   
        return (Student) liste.getFirst();
    }

    /** 
     * Das letzte Element zurueckgeben 
     * 
     * @return den letzten Studenten
     */
    public Student getLast() {
        return (Student) liste.getLast();
    }

    /** 
     * An welcher Stelle steht der Student     
     * @param o der zusuchende Student
     * @return den Index des Studenten oder -1
     */
    public int indexOf(Student o) {
        return liste.indexOf(o);
     }

    /**
     * Das erste Element loeschen
     * @exception NoListException falls liste null ist
     */
    public void remove() throws htw.exceptions.NoListException {
        if( liste == null )
            throw new htw.exceptions.NoListException("Liste wurde noch nicht angelegt");
        
        liste.removeLast();
    }

    /**
     * @return Anzahl der Elemente
     */
    public int size() {
        return liste.size();
    }

    /**
     * Kopiert die aktuelle Liste und gibt die Kopie zurueck
     * 
     * @return gibt die kopierte Liste zurueck
     * @exception NoListException falls liste null ist
     */
    public StudentList clone()
    {
        return liste.clone();
    }
    
    /**
     * Eine Liste wird an die vorhandene angehaengt
     * 
     * @param anzufuegende Liste
     * @exception NoListException falls liste null ist
     */
    public void append(StudentQueue l) throws htw.exceptions.NoListException
    {
        liste.append(l.getStudentList());
    }
    /**
     * Vergleicht zwei Listen auf inhaltlische gleichheit
     * 
     * @param zu pruefende Liste
     * @return gibt false aus, wenn die Listen nicht gleich sind
     * @exception NoListException falls liste null ist
     */
    public boolean equals(StudentQueue l) throws htw.exceptions.NoListException
    {
        return liste.equals(l.getStudentList());
    }
    
    /**
     * @return StudentQueue als zeichenkette
     */
    public String toString() {
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < liste.size(); i++ ) 
             sb.append(" -> ").append(liste.get(i)); 
        return sb.toString();
    }
    
    public StudentList getStudentList() {
        return liste;
    }
}